problem analysis in software engineering